//
// Created by 张闳 on 2021/12/3.
//

#ifndef LIBMCOMMON_STRINGS_H
#define LIBMCOMMON_STRINGS_H


#include <stdbool.h>
/**
 * 取子串函数
 * @param str       源字符串
 * @param start     开始位置，从0开始
 * @param length    截取子串长度
 * @return          返回子字符串
 */
char* substr(char *str, int start, int length);

/**
 * 取子串函数1
 * @param str       源字符串
 * @param start     开始位置，从0开始
 * @param end       结束位置
 * @return          返回子字符串
 */
char* substring(char *str, int start, int end);

/**
 * 字符串替换函数
 * @param str       源字符串
 * @param search    搜索子串
 * @param replace   替换成的子串
 * @return          返回替换后的字符串
 */
char* str_replace(char *str, char *search, char *replace);

/**
 * 字符串对比函数
 * @param str1      要对比的字符串1
 * @param str2      要对比的字符串2
 * @return          相同返回true，不同返回false
 */
bool string_compare(char *str1, char *str2);

/**
 * 从源字符串复制
 * @param str       源字符串
 * @return          复制结果字符串
 */
char *create_string(char *str);

/**
 * 从源字符串复制,功能与上相同
 * @param str       源字符串
 * @return          复制结果字符串
 */
char *clone_string(char *str);

/**
 * 拼接两个字符串
 * @param str1      第1个字符串
 * @param str2      第2个字符串
 * @return          返回拼接后的字符串
 */
char *catenate_string(char *str1, char *str2);

/**
 * 计算字符串长度
 * @param str       字符串
 * @return          返回字符串长度
 */
int string_len(char *str);

/**
 * 判断字符串头尾是否存在空格
 * @param str       字符串
 * @return          如存在空格返回true，否则返回false
 */
bool has_headtail_space(char *str);

/**
 * 去除字符串头尾空格
 * @param str       源字符串
 * @return          返回去除空格之后的字符串
 */
char* trim_string(char *str);

/**
 * 去除字符串中ascii码可见字符(33-126)之外的字符
 * @param str       源字符串
 * @return          返回去除不可见字符之后的字符串
 */
char* get_visible_string(char *str);

/**
 * 销毁字符串，释放内存空间
 * @param str       要销毁的字符串指针
 * @return          无返回
 */
void* destroy_string(char *str);

/**
 * 字符串数组按长度排序
 * @param array_length      字符串数组中元素个数
 * @param source            要排序的字符串数组指针
 * @return          返回排序之后的字符串数组指针
 */
char** string_sort_bylength(int array_length, char **source);

/**
 * 从字符串数组中取出头几条并进行拼接
 * @param str_count         要取出的条数
 * @param strs              源字符串数组
 * @return          返回取出拼接后的头部字符串
 */
char* get_strings_head(int str_count, char **strs);

/**
 * 判断字符串是否英文字母开头
 * @param s         字符串
 * @return          是大小写英文字母开头返回true,否则返回false
 */
bool is_letter_start(char *s);

/**
 * 判断字符串首字母是否下划线
 * @param s         字符串
 * @return          是下划线开头返回true,否则返回false
 */
bool is_underline_start(char *s);

/**
 * 判断字符串是否以指定字母开头
 * @param s         字符串
 * @param start     开始字符
 * @return          返回true或false
 */
bool is_sth_start(char *s, char start);

/**
 * 在字符串数组中搜索字符串，其中字符串数组的元素与搜索串内容完全相同
 * @param array         字符串数组
 * @param array_length  字符串数组长度，即其中元素个数
 * @param search        要搜索的字符串
 * @return              搜索到返回true,否则返回false
 */
bool in_words_array(char **array, int array_length, char *search);

/**
 * 在字符串数组中搜索指定字符串中的子串是否存在
 * @param array         字符串数组
 * @param array_length  字符串数组长度
 * @param search        要搜索的字符串(目标串)
 * @param index         目标串中的起始位置，从0开始
 * @param len_pointer   搜索到匹配的子串长度，返回整数指针，未搜索到时返回空指针
 * @return              搜索到返回true,否则返回false
 */
bool in_words_array_ex(char **array, int array_length, char *search, int index, int *len_pointer);

/**
 * 判断字符串中是否包含指定字符
 * @param str         源字符串
 * @param search      搜索的字符
 * @return            包含则返回true,否则返回false
 */
bool in_string(char *str, char search);

/**
 * 判断字符串是否以目标子串开始
 * @param str       源字符串
 * @param start     起始子串
 * @return          是则返回true,否则返回false
 */
bool start_with(char *str, char *start);

/**
 * 判断字符串是否以目标子串结尾
 * @param str       源字符串
 * @param end       结尾子串
 * @return          是则返回true,否则返回false
 */
bool end_with(char *str, char *end);

#endif //LIBMCOMMON_STRINGS_H
